// 输入验证中间件
const { body, param, query, validationResult } = require('express-validator');

// 处理验证结果
const handleValidationErrors = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({
      success: false,
      message: '输入验证失败',
      errors: errors.array()
    });
  }
  next();
};

// 用户注册验证
const validateRegister = [
  body('username')
    .isLength({ min: 2, max: 50 })
    .withMessage('用户名长度必须在2-50个字符之间')
    .matches(/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/)
    .withMessage('用户名只能包含字母、数字、下划线和中文'),
  
  body('phone')
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号码'),
  
  body('password')
    .isLength({ min: 6, max: 20 })
    .withMessage('密码长度必须在6-20个字符之间'),
  
  body('email')
    .optional()
    .isEmail()
    .withMessage('请输入有效的邮箱地址'),
  
  body('real_name')
    .optional()
    .isLength({ max: 50 })
    .withMessage('真实姓名不能超过50个字符'),
  
  handleValidationErrors
];

// 用户登录验证
const validateLogin = [
  body('phone')
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号码'),
  
  body('password')
    .notEmpty()
    .withMessage('密码不能为空'),
  
  handleValidationErrors
];

// 台球桌创建/更新验证
const validateTable = [
  body('name')
    .isLength({ min: 1, max: 100 })
    .withMessage('台球桌名称长度必须在1-100个字符之间'),
  
  body('type')
    .isIn(['美式台球', '中式台球', '斯诺克', '九球'])
    .withMessage('台球桌类型无效'),
  
  body('hourly_rate')
    .isFloat({ min: 0 })
    .withMessage('小时费用必须是大于等于0的数字'),
  
  body('status')
    .optional()
    .isIn(['available', 'occupied', 'maintenance'])
    .withMessage('台球桌状态无效'),
  
  body('description')
    .optional()
    .isLength({ max: 500 })
    .withMessage('描述不能超过500个字符'),
  
  handleValidationErrors
];

// 订单创建验证
const validateOrder = [
  body('table_id')
    .isInt({ min: 1 })
    .withMessage('台球桌ID必须是正整数'),
  
  body('booking_date')
    .isISO8601()
    .withMessage('预订日期格式无效'),
  
  body('start_time')
    .matches(/^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/)
    .withMessage('开始时间格式无效'),
  
  body('end_time')
    .matches(/^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/)
    .withMessage('结束时间格式无效'),
  
  body('phone')
    .isMobilePhone('zh-CN')
    .withMessage('请输入有效的手机号码'),
  
  body('remark')
    .optional()
    .isLength({ max: 200 })
    .withMessage('备注不能超过200个字符'),
  
  handleValidationErrors
];

// 充值验证
const validateRecharge = [
  body('amount')
    .isFloat({ min: 0.01 })
    .withMessage('充值金额必须大于0.01'),
  
  body('payment_method')
    .isIn(['wechat', 'alipay', 'cash', 'card', 'virtual'])
    .withMessage('支付方式无效'),
  
  handleValidationErrors
];

// ID参数验证
const validateId = [
  param('id')
    .isInt({ min: 1 })
    .withMessage('ID必须是正整数'),
  
  handleValidationErrors
];

// 分页参数验证
const validatePagination = [
  query('page')
    .optional()
    .isInt({ min: 1 })
    .withMessage('页码必须是正整数'),
  
  query('pageSize')
    .optional()
    .isInt({ min: 1, max: 100 })
    .withMessage('每页数量必须在1-100之间'),
  
  handleValidationErrors
];

module.exports = {
  validateRegister,
  validateLogin,
  validateTable,
  validateOrder,
  validateRecharge,
  validateId,
  validatePagination,
  handleValidationErrors
};
